package com.lqian.demo02.part2;

import com.lqian.demo02.utils.JDBCUtils;

import java.sql.*;
import java.util.Map;

/**
 * SQL注入
 * @author：Melody_LQ
 * @time：2022/7/13 2:48 下午
 */
public class SQLInject {
    /**
     * Statement和PreparedStatement区别：
     * PreperedStatement是Statement的子类，它的实例对象可以通过调用
     * Connection.preparedStatement()方法获得，相对于Statement对象而言：PreperedStatement可以避
     * 免SQL注入的问题。
     * Statement会使数据库频繁编译SQL，可能造成数据库缓冲区溢出。
     * PreparedStatement可对SQL进行预编译，从而提高数据库的执行效率。并且PreperedStatement对于
     * sql中的参数，允许使用占位符的形式进行替换，简化sql语句的编写。
     * @param username
     * @param password
     */

    public static void main(String[] args) {
        //login("jack","123456");
        //SQL注入
        login("'or '1=1","111111");
    }

    public static void login(String username,String password){
            Connection conn = null;
            Statement st = null;
            ResultSet rs = null;

            try {
                conn = JDBCUtils.getConnection();
                st = conn.createStatement();
                //通过巧妙的技巧来拼接字符串，造成SQL注入，从而获取数据库数据
                //select * from users where name = '' and password= ''
                // select * from users where name='' or '1=1' and password = '111111'
                String sql = "select * from users where name='"+username+"' and password='"+password+"'";
                rs = st.executeQuery(sql);
                System.out.println("sql---> "+sql);
                while (rs.next()){
                    System.out.println(rs.getString("name"));
                    System.out.println(rs.getString("password"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                JDBCUtils.release(conn,st,rs);
            }
        }
}
